#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
defaultdict 详解与实例
defaultdict 是 collections 模块中的一个类，它继承自 dict
主要特点：当访问不存在的键时，会自动创建该键并设置默认值
"""

from collections import defaultdict



# 普通字典的问题
normal_dict = {}
try:
    print(normal_dict['不存在的键'])
except KeyError as e:
    print(f"普通字典访问不存在的键会报错: {e}")

# 解决方案一：使用 get 方法，提供默认值
value1=normal_dict.get('不存在的键', 0)  # 使用 get 方法提供默认值
print(f"使用 get 方法访问不存在的键: {value1}")    

# defaultdict 的解决方案。 
# 注意 括号中的int 是一个函数名，表示当访问不存在的键时，调用 int() 来生成默认值 0
default_dict = defaultdict(int)  # 默认值工厂函数是 int，返回 0
print(f"defaultdict 访问不存在的键: {default_dict['不存在的键']}")  # 输出 0
print(f"现在字典变成了: {dict(default_dict)}")

# 嵌套字典的问题
print("\n" + "=" * 60)

my_dict={}
my_dict['key1']=111 # 正常赋值

try:
    my_dict['key2']['key3']='value'  # 这行代码会报错，因为 'key2' 不存在，无法进行二级赋值
except KeyError as e:
    print(f"普通字典访问不存在的键会报错: {e}")

#要想不报错，需要先初始化 'key2'，如下所示
my_dict['key2']={}  # 先创建一个空字典
my_dict['key2']['key3']='value'  # 现在可以进行二级赋值了


# 用defaultdict 来解决上面的问题
print(" 基本用法 - 自动创建嵌套字典")
nested_dict = defaultdict(dict)

# 直接给不存在的键的子键赋值
nested_dict['用户1']['姓名'] = '张三'
nested_dict['用户1']['年龄'] = 25
nested_dict['用户2']['姓名'] = '李四'
nested_dict['用户2']['职业'] = '程序员'

print(f"嵌套字典内容: {dict(nested_dict)}")
